#ifndef BOUNDINGBOX_H
#define BOUNDINGBOX_H

#include <Qt>
#include "PlanoX.h"
#include "PlanoY.h"
#include "PlanoZ.h"

#define PROXIMO(a,b) ((a-b<ZERO)&&(a-b>-ZERO))

//* classe BoundingBox
  //* A BoundingBox tem 6 planos, contidos dois a dois nos planos:xy, xz, yz.
class BoundingBox {
  private:
    Vetor_3D extremo_inferior, extremo_superior; //pontos que limitam a caixa
    PlanoX *px1, *px2;
    PlanoY *py1, *py2;
    PlanoZ *pz1, *pz2;

    void configura(const Vetor_3D & _extremo_inferior, const Vetor_3D & _extremo_superior );

  public:

 //* Construtor e Destrutor

    BoundingBox(Vetor_3D _extremo_inferior,
                   Vetor_3D _extremo_superior );

    BoundingBox() { px1 = px2 = NULL; py1 = py2 = NULL; pz1 = pz2 = NULL;}

    BoundingBox( const BoundingBox &cx) { *this = cx; }

    ~BoundingBox();

    bool Intercepta( Raio r_vis, float* t = NULL) const;

    const Vetor_3D& getExtremo_inferior(void) const {return extremo_inferior; }
    const Vetor_3D& getExtremo_superior(void) const {return extremo_superior; }

    const PlanoX& getPXMin(void) { return *px1; }
    const PlanoX& getPXMax(void) { return *px2; }
    const PlanoY& getPYMin(void) { return *py1; }
    const PlanoY& getPYMax(void) { return *py2; }
    const PlanoZ& getPZMin(void) { return *pz1; }
    const PlanoZ& getPZMax(void) { return *pz2; }


    BoundingBox& operator=(const BoundingBox &cx);
};

#endif // BOUNDINGBOX_H
